perm filename AZER.VLI[VLI,LSP] blob
sn#381937 filedate 1978-09-08 generic text, type C, neo UTF8
COMMENT ā VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002
C00021 ENDMK
Cā;
; page display ;
(PPIOT 0 1) ; page 1 ;
(PPIOT 2 10) ; en position standard ;
(PPIOT 3 (+ (* 15 \1000) 1))) ; 15 glitches de 1 ;
; page LISP ;
(PPIOT 0 \400002) ; page 2 ;
; la position est standard ;
(PPIOT 3 (+ (* 6 \1000) 1))) ; 6 glitches de 1 ;
(PPIOT 1 \300000) ; active la page 1 et 2 ;
(STATUS 2 0 2) ; ne pas imprimer le temps et la forme ;
(DE TTYS (X Y S)
; edite la chaine S nornalement ;
; en position : Xieme ligne Yieme colonne ;
(UPGIOT ()
(cons \177 (cons \14 (cons (logxor \140 y)
(cons (logxor \140 x)
(MAPCAR (MAKLIST S) 'CASCII)))))))))))))
(de ttb (x y s) (ttys x y s))
; Qu 'est ce que le robot ? C'est
- sa position en x et y : xrpos et yrpos
- s'il tient une boite ou pas :
withnbox = nil
ou
withnbox = no de boite
;
; ROBOT trace un robot visible (i.e. visible = T)
ou invisible (i.e. visible = NIL)
si withnbox non-NIL (i.e. s'il tient une boite, elle
est tracee ou effacee selon la visibilite du robot
;
(de robot (x y visible visiblebase)
(ttb x (1- y) (if visible "|||" " "))
(ttb (1+ x) (1- y) (if visible "< >" " "))
(if withnbox (box (+ x 2) y withnbox visible visiblebase))
)
(de box (x y n visible savebase)
(setq y (- y 2))
(ttb x y (if visible "-----" " "))
(ttb (+ x 1) y (if visible "| |" " "))
(ttb (+ x 2) y (if (or visible savebase) "-----" " "))
(ttb (+ x 1) (+ y 2) (if visible n " "))
)
; ROBOT peut se deplacer HORIZONTALEMENT par
(yrmov newy)
ou VERTICALEMENT par
(xrmov newx)
la vitesse de deplacement est reglee par la valeur
de la variable globale RATE.
Apres deplacement on a xrpos = newx, ou yrpos = newy, selon le cas.
;
(de yrmov (to ;; dir)
(setq dir (if (gt (- to yrpos) 0) 1 -1))
(while (neq to yrpos)
(robot xrpos yrpos nil) ; invisibler !! ;
(beep) (repeat rate) ; temporiser ;
(robot xrpos (setq yrpos (+ dir yrpos)) t)
; visibler la new pos ;
))
(de xrmov (to ;; dir)
(setq dir (if (gt (- to xrpos) 0) 1 -1))
; horrible hack pour bases ;
(if (or (neq dir -1) (null withnbox)) nil
(robot xrpos yrpos nil t)
(beep) (repeat rate)
(robot (decr xrpos) yrpos t))
; end of horrible hack ;
(while (neq to xrpos)
(robot xrpos yrpos nil)
(beep) (repeat rate)
(robot (setq xrpos (+ dir xrpos)) yrpos t)
))
; Ou vit le robot AZERTYOP ? Dans un pays tel que ya
un PLAFOND : ligne X = 10
reglable quand meme (>= 10) : valeur de la variable globale PLAFOND
un sol XTERRE ou sont poses les blocs, par defaut ligne X = 23
Initialement le robot est quelque part.
La fonction PARTERRE initialise tout ca.
;
(de parterre (xtr plaf initxrob inityrob)
(setq xterre xtr plafond plaf xrpos initxrob yrpos inityrob)
(setq withnbox nil) ; au depart il tient rien ! ;
(setq boxes nil) ; au depart ya pas de boites ! ;
(setq rate 0) ; controle vitesse de deplacement ;
(ttb xterre 0 (dupl "-" 80)) ; hack CHAILLOUX pour tracer le sol ;
(robot xrpos yrpos t)
(initplaces) ; initialisation des places libres ;
)
(de initplaces ()
(setq places (append nplaces nil))
)
; Les places libres initiales sont dans la liste globale NPLACES
recopiee dans la liste de travail (queue) PLACES
PLACES est modifiee par (findplaceterre) et (giveplaceterre n)
;
(de findplaceterre () (nextl places))
(de giveplaceterre (n) (setq places (nconc1 places n)))
(setqq nplaces (3 9 17 27 37 49 61 68 75 ))
; L'appel initial : ;
(parterre 23 10 10 40)
; POUR: faire naitre une boite n sur
le sol: TERRE
une boite de no: ON
utiliser: (makenewbox n ON)
;
(de makenewbox (n on ;; aux x y)
(if (eq on 'terre) (setq x xterre y (findplaceterre))
(setq aux (wherebox on) x (car aux) y (cadr aux)))
(setq x (- x 2))
(box x y n t)
(inboxplace n x y)
)
; POUR: que le robot aille prendre la boite n
utiliser: (gotakebox n)
;
(de gotakebox (n ;; aux x y)
(setq aux (wherebox n) x (car aux) y (cadr aux))
(yrmov y) ; deplacement horizontal ;
(xrmov (- x 2)) ; descendre prendre boite ;
(setq withnbox n) ; robot tient a present quelque chose ;
(xrmov plafond) ; le baron noir remonte avec sa proie ;
(if (= x (- xterre 2)) (giveplaceterre y))
; remise a jour des places libres si
la boite prise etait par terre ;
(outboxplace n x y) ; remise a jour de la data-base des
boites-et-leurs-coordonnees-x-y ;
)
; POUR: que le robot aille poser la boite qu'il tient
(c'est la valeur de withnbox) sur l'objet ON i.e.
TERRE
ou
boite n
utiliser (goputbox ON)
;
(de goputbox (on ;; aux x y)
(if (eq on 'terre) (setq x xterre y (findplaceterre))
(setq aux (wherebox on) x (car aux) y (cadr aux)))
(yrmov y) ; deplacement horizontal ;
(xrmov (- x 4)) ; descendre avec le bebe ;
(inboxplace withnbox (- x 2) y)
; remise a jour de la data-base BOXES ;
(setq withnbox nil) ; il ne tient plus rien ;
(xrmov plafond) ; il remonte au plafond ;
)
; La data-base de (no-de-boite coord-x coord-y) est dans BOXES
(wherebox n) -> (coord-x coord-y)
(inboxplace n x y) -> colle le 3-uple dans BOXES
(outboxplace n x y) -> delete le 3-uple out of BOXES
;
(de wherebox (n) (cassq n boxes))
(de inboxplace (n x y) (setq boxes (cons [n x y] boxes)))
(de outboxplace (n x y) (setq boxes (delete [n x y] boxes)))
(DE AZERTYOP (;; PHRASE)
(PRINT '(AZERTYOP : BJOUR MSIEU))
(SETQ WORD NIL DABA [['DABA]] FOCUS NIL #OBJ NIL #REL NIL #LOC NIL)
(AZERCONT))
(DE AZERCONT ()
(WHILE (NOT (EQUAL (SETQ PHRASE (READ)) '(BYE)))
(OR (EVAL-NET (GET 'PHRASE 'NET) PHRASE)
(PRINT '(AZERTYOP : ZAI RIEN COMPRIS MSIEU))))
'(AZERTYOP : RVOIR MSIEU))
(DE EVAL-NET (NET PHRASE) (COND
((NULL NET) NIL)
((EVAL-CLAUSE (CAR NET) PHRASE))
(T (EVAL-NET (CDR NET) PHRASE))))
(DE EVAL-CLAUSE (CLAUSE PHRASE)
(IF (NULL CLAUSE) (LIST PHRASE)
(SETQ LASTWORD WORD WORD (CAR PHRASE))
(IF (ATOM (CAR CLAUSE))
(IF (EQ (NEXTL CLAUSE) WORD)
(EVAL-CLAUSE CLAUSE (CDR PHRASE)))
(SELECTQ (CAAR CLAUSE)
($ACT (EPROGN (CDAR CLAUSE)) (EVAL-CLAUSE (CDR CLAUSE) PHRASE))
($OR (IF (MEMQ WORD (CDAR CLAUSE))
(EVAL-CLAUSE (CDR CLAUSE) (CDR PHRASE))))
($TEST (IF (EVAL (CADAR CLAUSE))
(EVAL-CLAUSE (CDR CLAUSE) (CDR PHRASE))))
($CALL (SETQ AUX (EVAL-NET (GET (CADAR CLAUSE) 'NET) PHRASE))
(IF AUX (EVAL-CLAUSE (CDR CLAUSE) (CAR AUX))))
()
))))))))))))))))))
(DF DEF-NET (L) (PUT (CAR L) (CDR L) 'NET))
(DEF-NET PHRASE
(VOYONS ($ACT (SCENE)))
(($CALL NG) ($ACT (SETQ #OBJ #NG))
EST ($CALL LIEU) ($ACT (DECLARATIVE)))
(PREND ($CALL NG-LE) ($ACT (SETQ #OBJ #NG) (IMPER-1)))
(($OR MET POSE) ($CALL NG-LE) ($ACT (SETQ #OBJ #NG))
($CALL LIEU) ($ACT (IMPER-2)))
(POSE ($CALL NG-LE) ($ACT (SETQ #OBJ #NG #LOC 'TERRE) (IMPER-2)))
(OU EST ($CALL NG-IL) ($ACT (SETQ #OBJ #NG)(WHERE-Q)))
(($OR DE DU) ($CALL NG) ($ACT (FOCUS-IT #NG) (P-OUI-MSIEUR)))
(REPETE ($TEST (NUMBP (SETQ AUX WORD))) FOIS
($ACT (REPEAT AUX
(MAPC PHRASE
'(LAMBDA (PHRASE) (EVAL-NET (GET 'PHRASE 'NET)
PHRASE)))))
($ACT (P-OUI-MSIEU)))
)
(DEF-NET NG
(($TEST (NUMBP WORD)) ($ACT (SETQ #NG LASTWORD)))
(LE CUBE ($TEST (NUMBP WORD)) ($ACT (SETQ #NG LASTWORD)))
)
(DEF-NET LIEU
(($OR PAR SUR) TERRE ($ACT (SETQ #LOC 'TERRE #REL 'SUR)))
(SUR ($ACT (SETQ #REL 'SUR)) ($CALL NG-LUI) ($ACT (SETQ #LOC #NG)))
(SOUS ($ACT (SETQ #REL 'SOUS)) ($CALL NG-LUI) ($ACT (SETQ #LOC #NG)))
)
(DEF-NET NG-LE
(($CALL NG))
(LE ($ACT (SOLVE)))
)
(DEF-NET NG-IL
(($CALL NG))
(IL ($ACT (SOLVE)))
)
(DEF-NET NG-LUI
(($CALL NG))
(LUI ($ACT (SOLVE)))
)
(DE PRESENT (-P- DABA) (COND
((NULL DABA) NIL)
((MATCH -P- (NEXTL DABA)))
(T (PRESENT -P- DABA))))
(DE MATCH (-P- -D-) (COND
((AND (NULL -P-) (NULL -D-)) T)
((OR (NULL -P-) (NULL -D-)) NIL)
((ATOM (CAR -P-)) (IF (EQ (NEXTL -P-) (NEXTL -D-))
(MATCH -P- -D-)))
((EQ (CAAR -P-) '/,)
(MATCH (CONS (EVAL (CADAR -P-)) (CDR -P-)) -D-))
((EQ (CAAR -P-) '/!)
(IF (MATCH (CDR -P-) (CDR -D-))
(SET (CADAR -P-) (CAR -D-))))))))))))))))
(STATUS 18 '/! '(LAMBDA () (LIST '/! (READ))))
(STATUS 18 '/, '(LAMBDA () (LIST '/, (READ))))
(DE PRINZ L
(PRINT (APPEND '(AZERTYOP :) L)))
(DE SCENE () (MAPC DABA 'PRINT)
(IF (PRESENT '(!X MAIN) DABA) (PRINT 'ET 'JE 'TIENS X)))
(DE SOLVE () (SETQ #NG (NEXTL FOCUS)))
(DE IN-DABA (X) (SETQ DABA (CONS X DABA)))
(DE OUT-DABA (X) (OUDA X DABA))
(DE OUDA (X DB) (IF (EQUAL X (CAR DB)) (RPLACB DB (CDR DB))
(OUDA X (CDR DB))))
(DE P-ABSURDE ()
(PRINZ 'C/'EST 'SAUF 'VOT 'RESPECT 'MSIEU 'ABSURDE))
(DE P-DE-QUI ()
(PRINZ 'DE 'QUI 'VOUS 'CAUSEZ 'MSIEU '/?))
(DE P-YAPAS (X)
(PRINZ 'YA 'PAS 'DE X 'MSIEU))
(DE P-OUI-MSIEU ()
(PRINZ 'OUI 'MSIEU 'COMPRIS 'MSIEU))
(DE FOCUS-IT (X) (SETQ FOCUS (CONS X FOCUS)))
(DE DECLARATIVE () (COND
((EQ #REL 'SOUS) (P-ABSURDE))
((OR (NULL #OBJ) (NULL #LOC)) (P-DE-QUI))
((DECL DABA))))
(DE DECL (DB) (COND
((NULL DB) (IN-DABA (LIST #OBJ 'SUR #LOC)) (FOCUS-IT #OBJ) (P-OUI-MSIEU)
(MAKENEWBOX #OBJ #LOC))
((MEMQ #OBJ (NEXTL DB)) (PRINZ #OBJ 'EXISTE 'DEJA 'MSIEU))
(T (DECL DB))))
(DE IMPER-1 () (COND
((NULL #OBJ) (P-DE-QUI))
((PRESENT '(!X MAIN) DABA) (COND
((EQ X #OBJ) (PRINZ 'JELTIEN 'DEJA 'MSIEU) (FOCUS-IT #OBJ))
(T (PRINZ 'CAISSE 'QUEJFAI 'DE X 'MSIEU '/?) (FOCUS-IT X))))
((PRESENT '(!X SUR ,#OBJ) DABA)
(FREE #OBJ [#OBJ]) (IMPER-1))
((PRESENT '(,#OBJ SUR !X) DABA)
(OUT-DABA (LIST #OBJ 'SUR X)) (IN-DABA (LIST #OBJ 'MAIN))
(FOCUS-IT #OBJ) (P-OUI-MSIEU) (GOTAKEBOX #OBJ))
(T (FOCUS-IT #OBJ) (P-YAPAS #OBJ))))
(DE WHERE-Q ()
(IF (NULL #OBJ) (P-DE-QUI)
(FOCUS-IT #OBJ)
(COND
((PRESENT '(,#OBJ MAIN) DABA) (PRINZ 'JELTIEN 'BIEN 'MSIEU))
((PRESENT '(,#OBJ SUR !X) DABA)
(IF (EQ X 'TERRE)
(PRINZ 'PAR 'TERRE 'IL 'EST 'MSIEU)
(PRINZ 'IL 'EST 'SUR X 'MSIEU)))
((PRESENT '(!X SUR ,#OBJ) DABA)
(PRINZ X 'EST 'SUR 'LUI 'MAIS #OBJ 'EST 'NULLE 'PART '/,
'YA 'COMME 'CA 'DES 'OBJETS 'KISONT 'NULLE 'PART))
(T (P-YAPAS #OBJ)))))
(DE IMPER-2 () (COND
((OR (NULL #OBJ) (NULL #LOC)) (P-DE-QUI))
((EQ #OBJ #LOC) (PRINZ 'PERSONNE 'Y 'PEU 'FAIRE 'UNE 'CHOSE 'COMME
'CA 'MSIEU))
((EQ #REL 'SOUS) (P-ABSURDE))
((PRESENT '(,#OBJ MAIN) DABA)
(IF (AND (NEQ #LOC 'TERRE) (PRESENT '(!X SUR ,#LOC) DABA))
(PRINZ 'JPEUPA 'MSIEU 'YA X 'SUR #LOC)
(OUT-DABA (LIST #OBJ 'MAIN)) (IN-DABA [#OBJ 'SUR #LOC])
(FOCUS-IT #OBJ) (P-OUI-MSIEU) (GOPUTBOX #LOC)))
((PRESENT '(!X MAIN) DABA)
(PRINZ 'CAISSE 'QUE 'JFAIS 'DE X 'MSIEU '/?) (FOCUS-IT X))
((PRESENT '(,#OBJ SUR !X) DABA)
(FOCUS-IT #OBJ)
(COND
((EQ X #LOC) (PRINZ 'ILYEST 'DEJA 'MSIEU))
((PRESENT '(!X SUR ,#OBJ) DABA) (FREE #OBJ [#LOC]) (IMPER-2))
((AND (NEQ #LOC 'TERRE) (PRESENT '(!X SUR ,#LOC) DABA))
(FREE #LOC [#OBJ]) (IMPER-2))
(T (OUT-DABA [#OBJ 'SUR X]) (IN-DABA [#OBJ 'SUR #LOC])
(P-OUI-MSIEU) (GOTAKEBOX #OBJ) (GOPUTBOX #LOC))))
(T (P-YAPAS #OBJ)))))))))))))))))))))
(DE FREE (X PROTECT ;; Z)
(IF (PRESENT '(!Z SUR ,X) DABA)
(PROGN
(SETQ PROTECT (CONS Z (CONS X PROTECT)))
(FREE Z PROTECT)
(OUT-DABA [Z 'SUR X]) (GOTAKEBOX Z)
(IN-DABA [Z 'SUR (SETQ AUX (FINDPLACEANY PROTECT))])
(GOPUTBOX AUX)
)))
(DE FINDPLACEANY (PROTECT ;; X Y)
(LET ((P BOXES))
(SETQ Y (CAAR P))
(COND ((NULL P) 'TERRE)
((OR (PRESENT '(!X SUR ,Y) DABA) (MEMQ Y PROTECT))
(SELF (CDR P)))
(T Y))))